# @Time : 2020/7/17 14:26
# @Author : Fioman 
# @Phone : 13149920693
"""
Opencv中的很多函数都会指定一个掩模,也被称为掩码,例如:
计算结果 = cv.add(参数1,参数2,掩模)
当使用掩模的时候,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0.
掩模的作用就是,操作的时候,只针对掩模进行操作,其他的地方全部变成0.
掩模上的数据,可以看成是0和非零,而掩模操作只会在非零的地方进行.而在掩模是0的地方,全部会变成0.
所以掩模的作用可以看成是过滤掉操作区域. 执行操作还是原来的操作,只是掩模的作用是将操作的范围缩小了.
其他部分不用操作直接变成0.
"""
import cv2 as cv
import numpy as np

img1 = np.ones((4, 4), dtype=np.uint8) * 3
img2 = np.ones((4, 4), dtype=np.uint8) * 5
mask = np.zeros((4, 4), dtype=np.uint8)

mask[2:4, 2:4] = 1
img3 = np.ones((4, 4), dtype=np.uint8) * 66

print("img1 = \n", img1)
print("img2 = \n", img2)
print("mask = \n", mask)
print("初始值img3 = \n", img3)
img3 = cv.add(img1, img2, mask=mask)
print("求和之后img3 = \n", img3)

a = cv.imread("lena.bmp", cv.IMREAD_GRAYSCALE)
h, w = a.shape
mask = np.zeros((h, w), dtype=np.uint8)
mask[100:400, 200:400] = 255
mask[100:500, 100:200] = 255
newImg = cv.bitwise_and(a, a, mask=mask)
print("a.shape = {}".format(a.shape))
print("mask.shape = {}".format(mask.shape))

cv.imshow("a", a)
cv.imshow("mask", mask)
cv.imshow("newImg", newImg)

cv.waitKey(0)
cv.destroyAllWindows()
